//
//  PlayMusicHelp.m
//  MusicTextOne
//
//  Created by lanou3g on 15/11/17.
//  Copyright (c) 2015年 haiTeng. All rights reserved.
//

#import "PlayMusicHelp.h"
#import <AVFoundation/AVFoundation.h>


@interface PlayMusicHelp  ()
@property(nonatomic,strong)AVPlayer *avPlayer; //系统的播放器

@property(nonatomic,retain)NSTimer *timer; //定时器(让它在开始时候开始，暂停时候停止)
@end



//写单例
//建立AVPlayer,调音量
//写传入音乐地址方法 （创建AVPlayerItem, //用self 观察一下item 的 status
//当item 的 status 属性发生变化时就会触发观察者事件....(加一些安全判断))
//写观察者方法（获取总时长）
//封装方法:开始、暂停



@implementation PlayMusicHelp

- (void)dealloc{
    
}

//单例
+ (PlayMusicHelp *)share{
    
    static PlayMusicHelp *play = nil;
    static dispatch_once_t con;
    
    dispatch_once(&con, ^{
        play = [[PlayMusicHelp alloc] init];
        play.avPlayer = [[AVPlayer alloc] init];  //初始化音乐播放器
        play.avPlayer.volume = 2.0f;  //音量属性
        play.isPlay = NO;  //默认为不播放
        play.index = -1; 
        
    });
    
    return play;
}

//重写init初始化方法

- (instancetype)init{
    
    
    if (self = [super init]) {
        
//        
//        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playToEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
        
    }
    
    return self;
    
}

- (void)playToEnd{
    //确保block存在(安全判断)
    if (self.playToEndBlock) {
        self.playToEndBlock(); //回调block
    }
    
}




- (void)playMusicMp3Url:(NSString *)mp3Url{

    //安全判断
    if (!mp3Url) {
        return;
    }
    
  
    //如果存在当前磁带,移除
    if (self.avPlayer.currentItem) {
        [self.avPlayer.currentItem removeObserver:self forKeyPath:@"status"]; //移除当前（也就是移除当前监听）
    }
    
    
    //磁盘(磁带:播放地址 放入磁盘)
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:mp3Url]];
    //监听什么时候播放
    [item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    [self.avPlayer replaceCurrentItemWithPlayerItem:item]; //给音乐播放器添加磁盘
    
}

//观察者方法:当被观察者的某一属性发生改变，就会走这个方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    //new代表改变后的新值(监听传值)
    AVPlayerItemStatus status = [change [@"new"] integerValue];
    
    switch (status) {
        case AVPlayerItemStatusReadyToPlay:    //当status为播放状态
        {
            _sumtime = self.avPlayer.currentItem.duration.value / self.avPlayer.currentItem.duration.timescale; //当前播放音乐的总时长(秒) = 总播放的长度 除以 每一帧时间
            [self play];
        }
            break;
            
        default:{
            NSLog(@"错误!!");
        }
            
            break;
    }
    
}

//播放
- (void)play{
    [self.avPlayer play];  //(这就是封装思想)
    
    self.isPlay = YES; //当前为播放状态
    
    //安全判断
    if (self.timer == nil) {
           self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES]; //每0.1秒就调用这个selector
    }
    
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];//将定时器加入runloop中，（我们可以理解为:闭合的回路，让它一直执行这个方法）//现在我们在滑动视图的时候，图片就还在旋转,滑竿就还在滑动.
    //主线程默认开启，子线程默认关闭的
}

    //  每0.1秒调用block方法

- (void)playTimer{
    
    //计算当前播放了多少秒
    CGFloat timer = _avPlayer.currentTime.value / _avPlayer.currentTime.timescale;
    
    if (self.playTimerBlock) {
        self.playTimerBlock(timer); //把这个时间传出去
    }
    
    if (timer >= _sumtime - 1) {
        
        [self playToEnd];
    }
}


//暂停
- (void)pause{
    [self.avPlayer pause];
    
    self.isPlay = NO; //当前为停止状态
   
    //安全判断
    if (self.timer) {
        [self.timer invalidate]; //销毁定时器
        self.timer = nil; //把这个空间释放，指回空.
    }
    
    
}





//某一时刻开始播放
- (void)seekToTime:(CGFloat)time{

    //封装优化
    [self pause];//先暂停下
    
  
    //某一时间,播放的 进度 (可以理解为:第一个参数为当前时间 乘 第二个参数每一秒走多少进度 = 进度 )
    [self.avPlayer seekToTime:CMTimeMakeWithSeconds(time * _sumtime, self.avPlayer.currentTime.timescale) completionHandler:^(BOOL finished) {  //time * _sumtime计算时间
     
        if (finished) {
            [self play];  //找到节点成功后 播放
        }
        
    }];
    
 

}


//重写setVolume

- (void)setVolume:(CGFloat)volume{

    _avPlayer.volume = volume;
}



//重写getVoluem方法


- (CGFloat)volume{
    
    return _avPlayer.volume;
}



@end
